﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Integration;

namespace ProtekUtil
{
    public class ProtekLoader:Integration.Loader
    {
        System.Text.Encoding w1251 = System.Text.Encoding.GetEncoding(1251);
        public ProtekLoader()
        {
            this._nakl = new Nkld();
        }
        public override bool Load()
        {
            InternalLoad();
            return true;
        }
        public override string ConnectionString
        {
            get
            {
                throw new NotSupportedException();
            }
            set
            {
                throw new NotSupportedException();
            }
        }
       
        private void InternalLoad()
        {
            if (string.IsNullOrEmpty(this.DataFilePath))
                throw new Exception("Не задан путь к файлу с данными");
            try
            {
                using (FileStream fs = new FileStream(this.DataFilePath, FileMode.Open, FileAccess.Read))
                {
                    using (StreamReader sr = new StreamReader(fs,w1251))
                    {
                        string buf = sr.ReadToEnd();
                        this.Parse(buf);
                    }
                }
            }
            catch (System.IO.IOException ie)
            {
               // throw new Exception("Невозможно прочитать данные из файла", ie);
                System.Windows.Forms.MessageBox.Show("Ошибка в InternalLoad\n" + ie.Message);
            }
            catch (System.Exception ee)
            {
               // throw new Exception("Невозможно прочитать данные из файла", ee);
                System.Windows.Forms.MessageBox.Show("Ошибка в InternalLoad\n" + ee.Message);
            }
        }
        private void Parse(string str)
        {
            try
            {
                using (StringReader sr = new StringReader(str))
                {
                    string s;
                    ///читаем заголовок
                    while (true)
                    {
                        s = ReadNextString(sr);
                        if (s == null)
                            throw new Exception("Не верный формат файла накладной Протека!");
                        ///выходим как нашли заголовок заголовка
                        if (string.Compare(s, "[Header]", true) == 0)
                            break;
                    }
                    s = ReadNextString(sr);
                    this.ParseHeader(s);
                    ///ищем тело
                    while (true)
                    {
                        s = ReadNextString(sr);
                        if (s == null)
                            throw new Exception("Не верный формат файла накладной Протека!");
                        ///выходим как нашли заголовок тела
                        if (string.Compare(s, "[Body]", true) == 0)
                            break;
                    }
                    while (true)
                    {
                        s = ReadNextString(sr);
                        if (s == null)
                            break;
                        ParseLine(s);
                    }

                }
            }
            catch (Exception ee)
            {
                System.Windows.Forms.MessageBox.Show("Ошибка в Parse");
            }
            
        }
        System.Globalization.CultureInfo cultureInfo = System.Globalization.CultureInfo.InvariantCulture;
        DateTime nullDate = new DateTime(1900, 1, 1);
        private void ParseLine(string str)
        {
            
            string nam = string.Empty;
            try
            {
                System.Diagnostics.Debug.WriteLine(str);
               // System.Windows.Forms.MessageBox.Show(str);
                string[] buf = str.Split(new char[] { ';' });
                NkldItemInfo item = new NkldItemInfo();                
                item.CODEPST = buf[0];//код препарата/28268;
                item.NAME = buf[1];//название препарата/ЕЛЕНА КРЕМ УВЛАЖНЯЮЩИЙ С ГИАЛУРОНОВОЙ К-ТОЙ  МОЛОЧНЫМ ПРОТЕИНОМ И ВИТ. Е 50Г;
                nam = item.NAME;
                item.FIRM = buf[2];//название производителя/Рассвет космет. ф-ка;
                item.CNTR = buf[3];//страна/Россия;
                if (!string.IsNullOrEmpty(buf[4]))
                {
                    Int32 tmp;
                    if(Int32.TryParse(buf[4],out tmp))
                        item.QNT = tmp;// Convert.ToInt32(buf[4]);//количество/5;
                }
                if (!string.IsNullOrEmpty(buf[5]))
                {
                    decimal tmp;
                    if(decimal.TryParse(buf[5], System.Globalization.NumberStyles.Float,cultureInfo, out tmp))
                        item.PRICE2 = tmp;//цена пост с НДС/29.63;
                }
                if (!string.IsNullOrEmpty(buf[6]))
                {
                    decimal tmp;
                    if (decimal.TryParse(buf[6], System.Globalization.NumberStyles.Float, cultureInfo, out tmp))
                        item.PRICE1 = tmp;//цена произ без НДС/23.91;
                }
                /*1005^POCC RU.ПP14.B16153^ АНО НИИСНДВ;1005;01.10.2005;01.10.2008;4601499002832;;;0.00;;;;29.63;148.15;*/
                if (!string.IsNullOrEmpty(buf[7]))
                {
                    decimal tmp;
                    if (decimal.TryParse(buf[7], System.Globalization.NumberStyles.Float, cultureInfo, out tmp))
                        item.PRICE2N = tmp;//цена поставщ без НДС/25.11;
                }
                if ((item.PRICE2N != decimal.Zero) && (item.PRICE2 != decimal.Zero))
                {
                    decimal d1 = item.PRICE2;//с НДС
                    decimal d2 = item.PRICE2N;//без НДС
                    decimal d3 = d1 - d2;
                    decimal d4 = d3 * 100 / d2;
                    item.NDS = Convert.ToDouble(decimal.Round(d4,0,MidpointRounding.AwayFromZero));
                }
                //buf[8] - резерв/;
                if (!string.IsNullOrEmpty(buf[9]))
                {
                    double tmp;
                    if (double.TryParse(buf[9], System.Globalization.NumberStyles.Float, cultureInfo, out tmp))
                        item.PRCOPT = tmp;//надбавка оптового звена/5.00;
                }
                
                //buf[10];//Заводской срок годности в месяцах;/36;
                item.NUMGTD = buf[11];//buf[10];10ГТД;/--;
                //item.NUMGTD = buf[11];//
                ParseSeries(item, buf[12]);//11Серии сертификатов;
                //buf[12];/12Серия производителя;
                //buf[13] серия производителя
                DateTime d;
                if (DateTime.TryParse(buf[14], out d))
                    item.DateMade = d;
                else
                    item.DateMade = nullDate;
                if (DateTime.TryParse(buf[15], out d))
                    item.GDATE = d;
                else
                    item.GDATE = nullDate;
                item.EAN13 = buf[16];
                if (DateTime.TryParse(buf[17], out d))
                    item.DATEPRC = d;
                else
                    item.DATEPRC = nullDate;
                decimal dec;
                if (decimal.TryParse(buf[18], System.Globalization.NumberStyles.Float, cultureInfo, out dec))
                    item.REGPRC = dec;
                double dob;
                if (double.TryParse(buf[19], System.Globalization.NumberStyles.Float, cultureInfo, out dob))
                    item.PRCIMP = dob;
                Nkld.Items.Add(item);
            }
            catch (Exception ee)
            {
               // throw new Exception("Невозможно разобрать накладную!", ee);
                System.Windows.Forms.MessageBox.Show("Не удалось добавить строку\n" + nam, "Ошибка", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                
            }
        }
        private void ParseSeries(NkldItemInfo item, string str)
        {
            item.SERTDATE = nullDate; 
            try
            {
                if (string.IsNullOrEmpty(str))
                    return;
                string[] buf = str.Split(new char[] { '^' });
                if (buf.Length < 3)
                    return;
                item.SER = buf[0];
                item.SERTIF = buf[1];
                DateTime d;
                string sertorg = new string(buf[2].ToCharArray());
                if (sertorg.Length >= 10)
                {
                    if (DateTime.TryParse(sertorg.Substring(0, 10), out d))
                        item.SERTDATE = d;
                }
                //else
                 //   item.SERTDATE = nullDate;
                Int32 len = sertorg.Length;
                if (sertorg.Length > 11)
                    item.SERTORG = sertorg.Substring(11, len - 12);
                if (buf.Length > 3)
                {
                    for (Int32 i = 3; i < buf.Length; i++)
                    {
                        item.Note += buf[i] + "\n";
                    }
                }
            }
            catch (Exception ee)
            {
              //  System.Windows.Forms.MessageBox.Show("Ошибка в ParseSeries\n" + str);
            }
        }
        private void ParseHeader(string str)
        {
            try
            {
                string[] buf = str.Split(new char[] { ';' });
                Nkld.Header.NDOC = buf[0];
                DateTime d;
                if(DateTime.TryParse(buf[1],out d))
                    Nkld.Header.DATEDOC = d;// Convert.ToDateTime(buf[1]);                
            }
            catch (Exception ee)
            {
               // throw new Exception("Невозможно разобрать накладную!", ee);
                System.Windows.Forms.MessageBox.Show("Ошибка в ParseHeader\n" + str);
            }
        }
        private string ReadNextString(StringReader sr)
        {
            try
            {
                string str = sr.ReadLine();
                ///строки кончились
                if (str == null)
                {
                    return null;
                }
                if (str == string.Empty)
                    return ReadNextString(sr);
                if (str[0] == '-')
                    return ReadNextString(sr);
                return str;
            }
            catch (Exception ee)
            {
                System.Windows.Forms.MessageBox.Show("Ошибка в ReadNextString");
                return null;
            }
        }
    }
}
